package object;

/**
 * 变量作用域的细节
 */
public class VarScopeDetail {

    public static void main(String[] args) {

        /*
            1)属性和局部变量可以重名，访问是遵循就近原则
            2)在同一个作用域中，比如在同一个成员方法中，两个局部变量不能重名
            3)属性生命周期较长，伴随着对象的创建而创建，伴随着对象的销毁而销毁
              局部变量声明周期较短，伴随着它的代码块的执行而创建，伴随着代码块的销毁而销毁，即在一次方法调用过程中
            4)作用域范围不同
              全局变量/属性：可以被本类使用，或其他类使用(对象调用后)
              局部变量：只能在本类中对应的方法中使用
            5)修饰符不同
              全局变量/属性可以加修饰符
              局部变量不可以加修饰符
         */

        VarScopeDetail02 varScopeDetail02 = new VarScopeDetail02();
        varScopeDetail02.test();

        VarScopeDetail01 varScopeDetail01 = new VarScopeDetail01();
//        varScopeDetail01.age = 100;
        varScopeDetail02.test2(varScopeDetail01);
    }
}

class VarScopeDetail01 {

    public int age = 20;

    String name = "jack";

    public void say() {
        //属性和局部变量可以重名，访问时遵循就近原则
        String name = "king";
        System.out.println("say() name=" + name);
    }

    public void hi() {
        String address = "北京";
        //String address = "北京"; //错误，重复定义变量
    }
}

class VarScopeDetail02 {

    public void test() {

        //全局变量/属性：可以被本类使用，或其他类使用(通过对象调用)
        VarScopeDetail01 varScopeDetail01 = new VarScopeDetail01();
        System.out.println(varScopeDetail01.name);
    }

    public void test2(VarScopeDetail01 varScopeDetail01) {
        System.out.println(varScopeDetail01.age);
    }
}